Add "set_pte_at_sync" (integrated invlpg) in Linux i386/mm/highmem.c to improve perfo...
authoriap10@freefall.cl.cam.ac.uk <iap10@freefall.cl.cam.ac.uk>
Sat, 13 Aug 2005 21:52:46 +0000 (21:52 +0000)
committeriap10@freefall.cl.cam.ac.uk <iap10@freefall.cl.cam.ac.uk>
Sat, 13 Aug 2005 21:52:46 +0000 (21:52 +0000)
Signed-off-by: ian@xensource.com
linux-2.6-xen-sparse/arch/xen/i386/mm/highmem.c
linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable-2level.h
linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable-3level.h

index 1cfe059f8b47aa6634be62fecfff8bf542770573..c5b64185a5c0d3932d69c89fbaccd8a432f33773 100644 (file)
@@ -41,8 +41,7 @@ static void *__kmap_atomic(struct page *page, enum km_type type, pgprot_t prot)
        if (!pte_none(*(kmap_pte-idx)))
                BUG();
 #endif
-       set_pte(kmap_pte-idx, mk_pte(page, prot));
-       __flush_tlb_one(vaddr);
+       set_pte_at_sync(&init_mm, vaddr, kmap_pte-idx, mk_pte(page, prot));
 
        return (void*) vaddr;
 }
index 1ed6625fff41b0750ff28f341ca9da30ed6308a7..a8d2bcfaa853f2caf2c3323427f87713e06a490e 100644 (file)
@@ -25,6 +25,17 @@ inline static void set_pte_at(struct mm_struct *mm, unsigned long addr,
     }
 }
 
+inline static void set_pte_at_sync(struct mm_struct *mm, unsigned long addr, 
+                      pte_t *ptep, pte_t val )
+{
+    if ( ((mm != current->mm) && (mm != &init_mm)) ||
+        HYPERVISOR_update_va_mapping( (addr), (val), UVMF_INVLPG ) )
+    {
+        set_pte(ptep, val);
+       xen_invlpg(addr);
+    }
+}
+
 #define set_pte_atomic(pteptr, pteval) set_pte(pteptr,pteval)
 
 #ifndef CONFIG_XEN_SHADOW_MODE
index 16079faf2a9652a40b70e049663c68bc1a2fd7b0..7bdd48e70f5642ffaa0e63001907f9845b8dacb5 100644 (file)
@@ -79,6 +79,17 @@ inline static void set_pte_at(struct mm_struct *mm, unsigned long addr,
     }
 }
 
+inline static void set_pte_at_sync(struct mm_struct *mm, unsigned long addr, 
+                      pte_t *ptep, pte_t val )
+{
+    if ( ((mm != current->mm) && (mm != &init_mm)) ||
+        HYPERVISOR_update_va_mapping( (addr), (val), UVMF_INVLPG ) )
+    {
+        set_pte(ptep, val);
+       xen_invlpg(addr);
+    }
+}
+
 #ifdef CONFIG_XEN_SHADOW_MODE
 # define set_pmd(pmdptr,pmdval) \
                set_64bit((unsigned long long *)(pmdptr),pmd_val(pmdval))